/**
 * 
 */
package inmobiliaria.frsf.bo.impl;

import inmobiliaria.frsf.bo.ColeccionesComunesBO;
import inmobiliaria.frsf.dao.ColeccionesComunesDAO;
import inmobiliaria.frsf.dao.impl.ColeccionesComunesDAOImpl;
import inmobiliaria.frsf.model.Calle;
import inmobiliaria.frsf.model.Domicilio;
import inmobiliaria.frsf.model.Localidad;
import inmobiliaria.frsf.model.Provincia;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author Lucas
 * 
 */
public class ColeccionesComunesBOImpl implements ColeccionesComunesBO {

	private ColeccionesComunesDAO coleccionesComunesDAO = new ColeccionesComunesDAOImpl();

	public List<Provincia> getProvincias() throws Exception {

		List<Map<String, Object>> provinciasMap = coleccionesComunesDAO
				.getProvincias();
		List<Provincia> provincias = new ArrayList<Provincia>();

		for (Map<String, Object> map : provinciasMap) {
			provincias.add(mapToProvincia(map));
		}

		return provincias;
	}

	/**
	 * Arma la entidad de Provincia en base a un mapa
	 * 
	 * @param map
	 * @return
	 * @throws Exception
	 */
	private Provincia mapToProvincia(Map<String, Object> map) throws Exception {
		Provincia provincia = new Provincia();
		provincia.setId(Integer.parseInt(map.get("id").toString()));
		provincia.setNombre(map.get("nombre").toString());
		return provincia;
	}

	/**
	 * Arma la entidad de Localidad en base a un mapa
	 * 
	 * @param map
	 * @return
	 * @throws Exception
	 */
	private Localidad mapToLocalidad(Map<String, Object> map) throws Exception {
		Localidad localidad = new Localidad();
		localidad.setIdLocalidad(Integer.parseInt(map.get("id").toString()));
		localidad.setNombre(map.get("nombre").toString());
		return localidad;
	}

	/**
	 * Arma la entidad de Calle en base a un mapa
	 * 
	 * @param map
	 * @return
	 * @throws Exception
	 */
	private Calle mapToCalle(Map<String, Object> map) throws Exception {
		Calle calle = new Calle();
		calle.setId(Integer.parseInt(map.get("id").toString()));
		calle.setNombre(map.get("nombre").toString());
		return calle;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * inmobiliaria.frsf.bo.ColeccionesComunesBO#getLocalidades(java.lang.Long)
	 */
	public List<Localidad> getLocalidades(Long id) throws Exception {

		List<Map<String, Object>> provinciaMap = coleccionesComunesDAO
				.getLocalidades(id);
		List<Localidad> localidades = new ArrayList<Localidad>();

		for (Map<String, Object> map : provinciaMap) {
			localidades.add(mapToLocalidad(map));
		}

		return localidades;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * inmobiliaria.frsf.bo.ColeccionesComunesBO#getLocalidades(java.lang.Integer
	 * )
	 */
	public List<Calle> getCalles(Integer id) throws Exception {

		List<Map<String, Object>> calleMap = coleccionesComunesDAO
				.getCalles(id);
		List<Calle> calles = new ArrayList<Calle>();

		for (Map<String, Object> map : calleMap) {
			calles.add(mapToCalle(map));
		}

		return calles;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * inmobiliaria.frsf.bo.ColeccionesComunesBO#guardarDomicilio(inmobiliaria
	 * .frsf.model.Domicilio)
	 */
	public Integer guardarDomicilio(Domicilio domicilio) throws Exception {
		// Guardar Localidad
		if (domicilio.getCalle().getLocalidad().getIdLocalidad() == -1) {
			Integer idLocalidad = coleccionesComunesDAO
					.insertLocalidad(domicilio.getCalle().getLocalidad());
			domicilio.getCalle().getLocalidad().setIdLocalidad(idLocalidad);
		}

		// Guardar Calle
		if (domicilio.getCalle().getId() == -1) {
			Integer idCalle = coleccionesComunesDAO.insertCalle(domicilio
					.getCalle());
			domicilio.getCalle().setId(idCalle);
		}

		Integer idDomicilio = coleccionesComunesDAO.insertDomicilio(domicilio);
		return idDomicilio;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * inmobiliaria.frsf.bo.ColeccionesComunesBO#updateDomicilio(inmobiliaria
	 * .frsf.model.Domicilio)
	 */
	public void updateDomicilio(Domicilio domicilio) throws Exception {
		// Guardar Localidad
		if (domicilio.getCalle().getLocalidad().getIdLocalidad() == -1) {
			Integer idLocalidad = coleccionesComunesDAO
					.insertLocalidad(domicilio.getCalle().getLocalidad());
			domicilio.getCalle().getLocalidad().setIdLocalidad(idLocalidad);
		}

		// Guardar Calle
		if (domicilio.getCalle().getId() == -1) {
			Integer idCalle = coleccionesComunesDAO.insertCalle(domicilio
					.getCalle());
			domicilio.getCalle().setId(idCalle);
		}

		coleccionesComunesDAO.updateDomicilio(domicilio);
	}

}
